package com.sheng.leetcode.year2023.month02.day06;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2023/02/06
 * <p>
 * 2331. 计算布尔二叉树的值<p>
 * <p>
 * 给你一棵 完整二叉树 的根，这棵树有以下特征：<p>
 * 叶子节点 要么值为 0 要么值为 1 ，其中 0 表示 False ，1 表示 True 。<p>
 * 非叶子节点 要么值为 2 要么值为 3 ，其中 2 表示逻辑或 OR ，3 表示逻辑与 AND 。<p>
 * 计算 一个节点的值方式如下：<p>
 * 如果节点是个叶子节点，那么节点的 值 为它本身，即 True 或者 False 。<p>
 * 否则，计算 两个孩子的节点值，然后将该节点的运算符对两个孩子值进行 运算 。<p>
 * 返回根节点 root 的布尔运算值。<p>
 * 完整二叉树 是每个节点有 0 个或者 2 个孩子的二叉树。<p>
 * 叶子节点 是没有孩子的节点。<p>
 * <p>
 * 示例 1：<p>
 * 输入：root = [2,1,3,null,null,0,1]<p>
 * 输出：true<p>
 * 解释：上图展示了计算过程。<p>
 * AND 与运算节点的值为 False AND True = False 。<p>
 * OR 运算节点的值为 True OR False = True 。<p>
 * 根节点的值为 True ，所以我们返回 true 。<p>
 * <p>
 * 示例 2：<p>
 * 输入：root = [0]<p>
 * 输出：false<p>
 * 解释：根节点是叶子节点，且值为 false，所以我们返回 false 。<p>
 * <p>
 * 提示：<p>
 * 树中节点数目在 [1, 1000] 之间。<p>
 * 0 <= Node.val <= 3<p>
 * 每个节点的孩子数为 0 或 2 。<p>
 * 叶子节点的值为 0 或 1 。<p>
 * 非叶子节点的值为 2 或 3 。<p>
 * <p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/evaluate-boolean-binary-tree">2331. 计算布尔二叉树的值</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class LeetCode2331 {

    @Test
    public void test01() {
//        TreeNode left = new TreeNode(1);
//        TreeNode right = new TreeNode(3);
//        right.left = new TreeNode(0);
//        right.right = new TreeNode(1);
//        TreeNode root = new TreeNode(2);
//        root.left = left;
//        root.right = right;
        TreeNode root = new TreeNode(0);
        System.out.println(new Solution().evaluateTree(root));
    }
}

class Solution {
    public boolean evaluateTree(TreeNode root) {
        // 叶子节点要么值为 0（false），要么值为 1（true）
        // 非叶子节点要么为 2（OR），要么为 3（AND）
        if (root.left != null && root.right != null) {
            boolean left = evaluateTree(root.left);
            boolean right = evaluateTree(root.right);
            if (root.val == 2) {
                return left || right;
            } else {
                return left && right;
            }
        } else {
            return root.val == 1;
        }
    }
}

// Definition for a binary tree node.
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode() {
    }

    TreeNode(int val) {
        this.val = val;
    }

    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}
